﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Caching;

namespace RegexLib.Web.Models.Web
{
	/// <summary>
	/// 为~/App_Data/下的数据文件提供缓存。
	/// </summary>
	public class RxAppDataCache
	{
		/// <summary>
		/// 将对象放入缓存。
		/// </summary>
		/// <typeparam name="T">待缓存对象的类型。</typeparam>
		/// <param name="virtualPath">与数据对应的数据文件的路径，使用形如"~/App_Data/aaa"这样的虚拟路径。</param>
		/// <param name="obj">待缓存的对象。</param>
		public static void Set<T>(string virtualPath, T obj)
		{
			string filepath = HttpContext.Current.Server.MapPath(virtualPath);
			CacheDependency dependency = new CacheDependency(filepath);
			HttpContext.Current.Cache.Insert(virtualPath, obj, dependency);
		}

		/// <summary>
		/// 从缓存中读取对象。
		/// </summary>
		/// <typeparam name="T">待读取对象的类型。</typeparam>
		/// <param name="virtualPath">与数据对应的数据文件的路径，使用形如"~/App_Data/aaa"这样的虚拟路径。</param>
		/// <returns>缓存中的对象，如果不存在，返回T类型的默认值。</returns>
		public static T Get<T>(string virtualPath)
		{
			object obj = HttpContext.Current.Cache.Get(virtualPath);
			if (obj != null)
				return (T)obj;
			else
				return default(T);
		}

		/// <summary>
		/// 从缓存中读取对象。
		/// </summary>
		/// <typeparam name="T">待读取对象的类型。</typeparam>
		/// <param name="virtualPath">与数据对应的数据文件的路径，使用形如"~/App_Data/aaa"这样的虚拟路径。</param>
		/// <param name="defaultValue">当缓存数据不存在时返回的默认值。</param>
		/// <returns>缓存中的对象，如果不存在，返回由<see cref="defaultValue"/>所指定的的默认值。</returns>
		public static T Get<T>(string virtualPath, T defaultValue)
		{
			object obj = HttpContext.Current.Cache.Get(virtualPath);
			if (obj != null)
				return (T)obj;
			else
				return defaultValue;
		}
	}
}
